package fr.babostesting.examples.mobile.bench.virtual 
{
	import com.greensock.easing.Cubic;
	import com.greensock.easing.Strong;
	import com.greensock.TweenMax;
	import flash.desktop.NativeApplication;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.TouchEvent;
	import flash.geom.Matrix;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.Capabilities;
	import flash.text.AntiAliasType;
	import flash.text.TextField;
	import flash.ui.Multitouch;
	import flash.ui.MultitouchInputMode;
	import flash.utils.getTimer;
	import fr.babos.core.entries.Document;
	import fr.babos.graphic.components.base.BorderComponent;
	import fr.babos.graphic.components.base.ResizableComponent;
	import fr.babos.graphic.components.base.StageWrapper;
	import fr.babos.graphic.components.bitmaps.AdvancedBitmap;
	import fr.babos.graphic.components.containers.lists.AVirtualList;
	import fr.babos.graphic.components.containers.lists.FreeVirtualList;
	import fr.babos.graphic.components.containers.lists.IVirtualList;
	import fr.babos.graphic.components.containers.lists.IVirtualListDelegate;
	import fr.babos.touch.emulator.MouseToTouchEmulator;
	import fr.babos.touch.indicator.TouchIndicator;
	import fr.babos.utils.ArrayUtils;
	import fr.babos.utils.EnvUtils;
	import fr.babos.utils.ScreenUtils;
	import fr.babostesting.examples.mobile.bench.virtual.elements.TweetListElement;
	import fr.babostesting.examples.mobile.bench.virtual.items.TweetItem;
	import net.hires.debug.Stats;
	
	/**
	 * @author ZoulouX
	 */
	public class VirtualListTest extends Document implements IVirtualListDelegate
	{
		[Embed(source="../../../../../../../lib/graphics/ipad-topbar-back.png")]
		public static const IPadTopbarBackImage:Class;
		public static const __iPadTopbarBackImageData:BitmapData = (new IPadTopbarBackImage() as Bitmap).bitmapData;
		
		private var _wrapper				:StageWrapper;
		private var _container				:ResizableComponent;
		private var _virtualList			:AVirtualList;
		private var _topBarBitmap			:Bitmap;
		private var _twitterData			:Object;
		private var _background				:Bitmap;
		private var _topBar:AdvancedBitmap;
		
		public function VirtualListTest ()
		{
			
		}
		
		override public function init ():void 
		{
			// Configurer le stage
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.frameRate = 60;
			stage.quality = StageQuality.LOW
			
			// Configurer le multitouch
			if (Multitouch.supportsTouchEvents)
			{
				Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
			}
			else
			{
				MouseToTouchEmulator.emulate(stage, true, true, false);
			}
			
			// Créer le wrapper de l'application
			_wrapper = new StageWrapper(stage);
			
			// La barre du dessus
			_topBar = new AdvancedBitmap(__iPadTopbarBackImageData, AdvancedBitmap.NO_SCALE_MODE, 1);
			_topBar.place(0, 0, NaN, 0).size(NaN, 44).into(_wrapper);
			_topBar.addEventListener(TouchEvent.TOUCH_TAP, gotoTopHandler);
			
			// Le service
			//var serviceURL:String = "http://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=zouloux&count=40";
			//var serviceURL:String = "http://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=zouloux&count=100";
			var serviceURL:String = "http://search.twitter.com/search.json?q=twitterapi&rpp=300&include_entities=true&result_type=mixed";
			//var serviceURL:String = "http://search.twitter.com/search.json?q=flash&rpp=1&include_entities=true&result_type=mixed";
			
			var urlLoader:URLLoader = new URLLoader(new URLRequest(serviceURL));
			urlLoader.addEventListener(Event.COMPLETE, dataLoadedHandler);
		}
		
		/**
		 * Les données sont prêtes
		 */
		public function dataLoadedHandler (event:Event = null):void
		{
			trace("loaded");
			
			// Ne plus écouter
			(event.currentTarget as URLLoader).removeEventListener(Event.COMPLETE, dataLoadedHandler);
			
			// Parser
			_twitterData = JSON.parse((event.currentTarget as URLLoader).data);
			//_twitterData = {};
			
			// Redéfinir la base selon le service
			if (_twitterData.results != null)
				_twitterData = _twitterData.results;
			
			// L'action de remontée
			_wrapper.onGotoTop.add(gotoTopHandler);
			
			// Le container pour vérifier le fonctionnement des masques
			_container = new ResizableComponent().place(0, 0, 0, 0).into(_wrapper, "container", 0) as ResizableComponent;
			
			
			// La liste virtuelle
			_virtualList = new FreeVirtualList(this, AVirtualList.VERTICAL_ORIENTATION).place(0, 0, 0, 0).into(_container, "virtualList") as AVirtualList;
			
			if (EnvUtils.getDeviceType() == EnvUtils.TABLET)
			{
				_virtualList.place(0, NaN, 0, 0).size(600, NaN);
				new BorderComponent(0xcccccc, 1).place(0, NaN, 0, 0).size(600, NaN).into(_container, "border")
			}
			
			_virtualList.container.place(44, 0, 0, 0);
		}
		
		/**
		 * Action de retour au début
		 */
		public function gotoTopHandler (event:TouchEvent = null):void
		{
			// Tweener la liste vers le haut
			TweenMax.to(_virtualList, .7 - _virtualList.currentScroll / 1000, {
				currentScroll: 0,
				ease: Cubic.easeInOut
			});
		}
		
		/**
		 * Récupérer le premier index de la liste
		 */
		public function getVListFirstElementIndex (pTarget:IVirtualList):int
		{
			return 0;
		}
		
		/**
		 * Récupérer le dernier index de la liste
		 */
		public function getVListLastElementIndex (pTarget:IVirtualList):int 
		{
			return Math.max(0, _twitterData.length - 1);
		}
		
		/**
		 * Récupérer la taille moyenne d'un élément
		 */
		public function getVListTipicalElementSize (pTarget:IVirtualList):int
		{
			return 80;
		}
		
		/**
		 * Besoin d'un élément a tel index
		 */
		public function getVListElementAt (pTarget:IVirtualList, pIndex:int):ResizableComponent
		{
			// Si une données du service correspond a cet index
			if (_twitterData[pIndex] != null)
			{
				// On créé l'item
				var item:TweetItem = new TweetItem();
				
				// On cible les données dans le service
				var tweetElement:Object = _twitterData[pIndex];
				
				// Fonction de suppression de cet item
				item.remove = function (pElement:ResizableComponent):void
				{
					_twitterData = ArrayUtils.deleteElement(_twitterData as Array, tweetElement);
					_virtualList.removeElement(pElement);
					_virtualList.update();
				}
				
				// Le texte du tweet
				item.text = pIndex + " " + tweetElement.text;
				//item.text = String(pIndex) + " - " + String(getTimer());
				//item.screenName = "test";
				
				// L'image du tweet
				if (tweetElement.profile_image_url != null)
					item.avatar = tweetElement.profile_image_url;
				else if (tweetElement.user != null)
					item.avatar = tweetElement.user.profile_image_url;
				
				// Le nom d'utilisateur du tweet
				if (tweetElement.from_user != null)
					item.screenName = tweetElement.from_user;
				else if (tweetElement.user != null)
					item.screenName = tweetElement.user.screen_name;
				
				// Ajouter l'élément
				return new TweetListElement(item);
			}
			else
			{
				// Ajouter un élément vide
				return new TweetListElement();
			}
		}
	}
}